package main

import (
	"context"
	"log"
	"net"
	"sync/atomic"
	"tronado/internal/model"
)

func main() {
	ctx, cancel := context.WithCancel(context.Background())
	s := &model.Server{
		Ctx:    ctx,
		Cancel: cancel,
	}

	// 启动监控协程，每秒打印连接数
	go s.Monitor()

	// 启动服务器
	l, err := net.Listen("tcp", ":8080")
	if err != nil {
		log.Fatal(err)
	}
	s.Listener = l
	log.Println("Server started on :8080")

	// 处理优雅退出
	go s.HandleShutdown()

	// 主循环，接受连接
	for {
		conn, err := l.Accept()
		if err != nil {
			select {
			case <-s.Ctx.Done():
				log.Println("Server is shutting down, stop accepting")
				return
			default:
				log.Println("Accept error:", err)
				continue
			}
		}

		// 重要：检查连接数，如果超过单实例承载能力，可以选择拒绝
		if atomic.LoadInt64(&s.ActiveConns) > 800000 { //  example threshold
			conn.Close()
			log.Println("Refused connection: over capacity")
			continue
		}
		atomic.AddInt64(&s.ActiveConns, 1)
		go s.HandleConnection(conn) // 为每个连接启动goroutine
	}
}
